
/**
 * 
 */
package com.zsrt.day20170412.student.dao;

import java.util.Scanner;

import com.zsrt.day20170412.student.entity.StudentEntity;
import com.zsrt.utils.ArrayUtil;


/**
 * 贾梦菊	张嘉源	罗智壕	何小强	靳志辉
   66    76      56      86      45

 * 1.实现单个的增删改查
 * 
 * 2.(选做)实现一个甚至多个的删除操作
 * @author jmj
 * @date 2017年4月12日
 * @time 上午10:25:34
 */
public class StudentDao {
	
	
	/**
	 * 找到成绩不大于60的人
	 * @param students  搜索的范围
	 * @return
	 */
	public StudentEntity[] findNG(StudentEntity[] students){
		//用来表示不及格的人有多少
		int count=0;
		//遍历找到成绩小于60的人  创建一个新对象数组用来存放返回结果    
		for(int index=0;index<students.length;index++){
			StudentEntity student = students[index];
			double score = student.getScore();
			if(score<60){
				//不及格+1
				count++;
			}
		}
		//count 为不及格人数
        StudentEntity[] results = new StudentEntity[count];
        
        //count清零
        count= 0;
        //遍历原来的数组将不及格的人放入新数组
        for(int index=0;index<students.length;index++){
        	StudentEntity student = students[index];
        	double score = student.getScore();
			if(score<60){
				//不及格+1
				count++;
				//将找到的不及格数一一对应的放入新数组    
				results[count-1] = students[index];
			}
        }
		//返回新数组
		return results;
	}

	
	/**
	 * 改变数组中的某个学生的分数
	 * @param students   搜索的范围
	 * @param oldName    要求改变的学生名字
	 * @param updateScore  改变后的分数
	 * @return
	 */
	public StudentEntity updateStudentScore(StudentEntity[] students,
			String oldName,double updateScore){
		
		StudentEntity student = new StudentEntity();
		//判断这个学生是否在数组中
		int index = searchStudent(students, oldName);
		if(index != -1){
			
			//如果在数组中就执行改变分数的操作
			student = students[index];
			double score = student.getScore();
			if(score >=0  && score<=100){
				student.setScore(updateScore);
			}
			//返回这个学生的最新信息
			return student;
		}
		//若没找到该学生在数组中就结束程序
		System.out.println("该学生不在数组中。");
		return null;
	}
	
	/**
	 * 查找某位学生是否在数组中
	 * 如果在数组中则返回其下标
	 * @param students
	 * @param name
	 * @return
	 */
	public int searchStudent(StudentEntity[] students,String name){
		int count =-1;
		StudentEntity student = new StudentEntity();
		
		
		//遍历数组找到name的信息是否在数组中
		for(int index=0;index<students.length;index++){
			student = students[index];
			String newName = student.getName();
			if(newName.equals(name)){
				return index;
			}
		}
		
		//返回值 如果是-1就代表不在数组中存在
		return count;
		
	}
	
	/**
	 * 增加数组中的学生
	 * @param students
	 */
	public void addStudent(StudentEntity[] students){
		Scanner scanner = new Scanner(System.in);
		
		StudentEntity[] newStudents = new StudentEntity[students.length+1];
		for(int i=0;i<students.length;i++){
			newStudents[i]=students[i];
		}
		while(true){
			System.out.println("请输入您想添加的名字");
			String name = scanner.nextLine();
			if(name.length()>=2 && name.length()<=4){
				//得先定义一个对象
				StudentEntity xm = new StudentEntity();
				xm.setName(name);
				//最后一位数组元素原本是null 
				newStudents[students.length]=xm;
				break;
			}else{
				System.out.println("输入有误");
			}
		}	
		while(true){
			System.out.println("请输入您想添加的年龄");
			int age = scanner.nextInt();
			if(age>=0 && age<=120){
				newStudents[students.length].setAge(age);
				break;
			}else{
				System.out.println("输入有误");
				
			}
		}	
		while(true){
			System.out.println("请输入您想添加的分数");
			double score =scanner.nextDouble();
			if(score>=0 && score<=100){
				newStudents[students.length].setScore(score);
				break;
			}else{
				System.out.println("输入有误");
			
			}
		}
		ArrayUtil.StudentEntity(newStudents);
		scanner.close();
	}
	
	/**
	 * 删除单个元素
	 * @param students
	 * @param name
	 * @return 
	 */
	public StudentEntity[] deleteStudent(StudentEntity[] students,String name){
		int index=searchStudent(students, name);
		if(index !=-1){
			StudentEntity[] newStudents = new StudentEntity[students.length-1];
			for(int i=0;i<students.length-1;i++){
				if(index>i){
					newStudents[i]=students[i];
				}else if(i==index){
					newStudents[i]=students[i+1];
					
				}else{
					newStudents[i]=students[i+1];			
				}
			}
			return newStudents;
		}else{
			return students;
		}
	}
	
	
	/**
	 * 删除一个或一批数据
	 * @param oldStudents      原本的数组
	 * @param deletestudents   要删除的数组
	 * @param newStudents      删除后的数组
	 */
	public StudentEntity[] deleteSomeStudents(StudentEntity[] oldStudents,StudentEntity[] deleteStudents){
		//定义一个计数器  如果要删除的数组元素在原本的数组中+1
		int count=0;
		//遍历新的要删除的数组
		for(int index = 0;index<deleteStudents.length;index++){
			StudentEntity student = deleteStudents[index];
			String name = student.getName();
			int xb = searchStudent(oldStudents, name);
				//查找要删除的数组中元素是否在原来的数组中	
				if(xb !=-1){
					//得到要删除的数据个数
					count++;			
				}
		}
		
		//数组长度得到 oldStudents.length-count
	
		//用来存放要被删除的数据
		StudentEntity[] dels =new StudentEntity[count];
		int aa=0;
		//来存放数据
		for(int index = 0;index<deleteStudents.length;index++){
			StudentEntity student = deleteStudents[index];
			String name = student.getName();
			int xb = searchStudent(oldStudents, name);
				//查找要删除的数组中元素是否在原来的数组中	
				if(xb !=-1){
					//得到要删除的数据个数
					dels[aa]=deleteStudents[index];
					aa++;
				}
		}
		//用来存放删除结果的数组
		StudentEntity[] newStudents = new StudentEntity[oldStudents.length-count];
		
		int nn =0;
		//执行删除数组的操作
		for(int index= 0;index<oldStudents.length;index++){
			StudentEntity student = new StudentEntity();
			student = oldStudents[index];
			//取原数组中的学生姓名
			String name1 = student.getName();
			int counter=0;
			for(int i=0;i<dels.length;i++){
				student = dels[i];
				//取要被删除的数组中的学生姓名
				String name2= student.getName();
				if( ! name1.equals(name2)){
					//不相等时不进行操作
				}else{
					//如果被删除的目标一次等于原来的数组中的姓名计数器加1
					counter++;
				}
			}
			//计数器等于0说明一次都没有姓名相等
			if(counter ==0){	
				// 写进newStudents数组
				newStudents[nn] = oldStudents[index];	
				//下标+1
				nn++;
			}
		}
		return newStudents;
	}	
	
	
}
